home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / modula2 / 501 < prev    next >
Encoding:
Internet Message Format  |  1996-08-06  |  2.2 KB

  1. Path: nordruth.rchland.ibm.com!seurer
  2. From: seurer@nordruth.rchland.ibm.com (Bill Seurer)
  3. Newsgroups: comp.lang.modula2
  4. Subject: Re: Random in Modula-2 ???
  5. Date: 1 Apr 1996 19:49:33 GMT
  6. Organization: IBM Rochester MN
  7. Distribution: world
  8. Message-ID: <4jpc0d$fqb@locutus.rchland.ibm.com>
  9. References: <Pine.SOL.3.91.960401140010.28172E-100000@aton.abo.fi>
  10. Reply-To: BillSeurer@vnet.ibm.com
  11. NNTP-Posting-Host: nordruth.rchland.ibm.com
  12.  
  13. IMPLEMENTATION MODULE Random;
  14. (*
  15.  * Generates random numbers using the Lehmer algorithm, f(z)=az MOD m.  The default a is 16,807 and the default m is 2,147,483,647 (2**31-1).
  16.  * See "Random number Generators: Good Ones Are Hard To Find", Park, Stephen K., and Miller, Keith W., Communications of the ACM, October, 1988.
  17.  *
  18.  * In the descriptions of the procedures the bounds of the ranges are shown using:
  19.  *  [ and ] to denote an end of a range that is inclusive (i.e., IS included in the range).
  20.  *  ( and ) to denote an end of a range that is exclusive (i.e., ISN'T included in the range).
  21.  *)
  22. VAR
  23.   seed: INTEGER;
  24.   a, m, q, r: INTEGER;
  25.  
  26.  
  27. PROCEDURE Real(): REAL;
  28. (*
  29.  * Returns a random REAL number in the range [0..1)
  30.  *)
  31. VAR
  32.   lo, hi, test: INTEGER;
  33. BEGIN
  34.   hi := seed DIV q;
  35.   lo := seed MOD q;
  36.   test := a * lo - r * hi;
  37.   IF test > 0 THEN
  38.     seed := test;
  39.   ELSE
  40.     seed := test + m;
  41.   END (*Else*);
  42.   RETURN FLOAT(seed) / FLOAT(m);
  43. END Real;
  44.  
  45.  
  46. PROCEDURE Seed(): INTEGER;
  47. (*
  48.  * Returns the current seed of the random number generator
  49.  *)
  50. BEGIN
  51.   RETURN seed;
  52. END Seed;
  53.  
  54.  
  55. PROCEDURE SetSeed(newSeed: INTEGER);
  56. (*
  57.  * Sets the seed of the random number generator
  58.  *)
  59. BEGIN
  60.   seed := newSeed;
  61. END SetSeed;
  62.  
  63.  
  64. PROCEDURE GetAM (VAR currA, currM: INTEGER);
  65. (*
  66.  * Gets the current values for the multiplier (a) and modulus (m) used in determining the random sequence
  67.  *)
  68. BEGIN
  69.   currA := a;
  70.   currM := m;
  71. END GetAM;
  72.  
  73.  
  74. PROCEDURE SetAM (newA, newM: INTEGER);
  75. (*
  76.  * Sets new values for the multiplier (a) and modulus (m) used in determining the random sequence.
  77.  *)
  78. BEGIN
  79.   a := newA;
  80.   m := newM;
  81.   q := m DIV a;
  82.   r := m MOD a;
  83. END SetAM;
  84.  
  85.  
  86. BEGIN
  87.   SetAM (16807, 2147483647);
  88.   SetSeed (1);
  89. END Random.
  90.  
  91. -- 
  92.  
  93. - Bill Seurer     ID Tools and Compiler Development      IBM Rochester, MN
  94.   Business: BillSeurer@vnet.ibm.com               Home: BillSeurer@aol.com
  95.